package com.info.zhiduoduo.common.annotation;

import com.baomidou.mybatisplus.activerecord.Model;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 标记 系统中要记录操作日志的具体数据库的entity类型，比如更新创客、企业、合伙人等entity
 * <p> 配合{@code ZddLog}注解使用。
 *
 * @see ZddLog
 */
@Target({ElementType.PARAMETER})
@Retention(RUNTIME)
@Documented
public @interface LogEntity {

	/**
	 * 要记录的Entity class类型，比如创客-Maker.class, 创客账户-MakerAccount.class，企业-Company.class etc.
	 * <p> 在本项目中必须是MyBatis-plus Entity类型，方便直接new XXXX().selectById()等操作获取entity对象
	 */
	Class<? extends Model<?>> entity();

	/**
	 * 标记需要记录日志的数据是单个对象还是多个对象（list）；例如：通过项目id获取到的所有子项目列表，我们需要记录所有子项目的日志。
	 */
	boolean isList() default false;

	/**
	 * 要获取{@link LogEntity#entity()}对象需要依赖其他entity对象的类型。
	 * <p> </p>
	 * 比如：我们要获取Maker对象，{@link LogEntity#entity()} 设置的值就是{@code Maker.class}，但是我们没有能直接查询出Maker对象的参数（userid），
	 * 需要先获取MakerAccount对象，从MakerAccount中获取userid字段，才能去获取对应的Maker对象。
	 * 此时，{@link LogEntity#dependOnEntities()}的值就是{@code MakerAccount.class}。
	 * 即 Maker对象依赖于MakerAccount对象。
	 * <p> </p>
	 * 并且要保证这里设置的dependOnEntity注解里面的{@link DependOnEntity#entity()}值是在{@link ZddLog#entities()}中已经配置过。
	 */
	DependOnEntity[] dependOnEntities() default {};

	/**
	 * 要获取{@link LogEntity#entity()}对象需要的接口请求参数中的哪些字段。
	 * <p> </p>
	 * 需要特殊处理逗号分隔的参数和列表参数
	 * <p> </p>
	 */
	LogParameter[] parameters() default {};
}
